#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>
#define MAX_NUM 10000
int number;
// 创建一把互斥锁
pthread_mutex_t mutex;
void *funA(void* arg)
{
  for(int i=0; i<MAX_NUM; ++i)
  {
    // 访问全局变量之前枷锁
    // 如果mutex被锁上了，代码阻塞在当前位置
    pthread_mutex_lock(&mutex);
    ++number;
    printf("Thread A, id = %lu, number = %d\n", pthread_self(), number);
    // 解锁
    pthread_mutex_unlock(&mutex);
    usleep(10);
  }
  return NULL;
}
void *funB(void* arg)
{
  for(int i=0; i<MAX_NUM; ++i)
  {
    pthread_mutex_lock(&mutex);
    ++number;
    printf("Thread B, id = %lu, number = %d\n", pthread_self(), number);
    pthread_mutex_unlock(&mutex);
    usleep(10);
  }
  return NULL;
}
int main()
{
  // 初始化 互斥锁
  pthread_mutex_init(&mutex, NULL);
  // 数数 数完之后失去CPU还没放回去内存:
  pthread_t pth1;
  pthread_t pth2;
  pthread_create(&pth1, NULL, funA, NULL);
  pthread_create(&pth2, NULL, funB, NULL);
  pthread_join(pth1, NULL);
  pthread_join(pth2, NULL);

  // 释放互斥锁资源
  pthread_mutex_destroy(&mutex);
}
